﻿ 
#include "stdafx.h"
#include "WordsWeight.h"


//======================================================================
//					WordsWeightItem_s							
//======================================================================
void WordsWeightItem_s::MakeString(std::string& dest)
{
	dest = word;
	dest += "=";
	char temp[32];
	sprintf(temp, "%u", (unsigned int)count);
	dest += temp;
}

bool WordsWeightItem_s::FromString(const std::string& src) throw(Error)
{
	//assert(false && " ПРочитать из строки слово и цифру (цифра после знака =) ");  return false;

	size_t separator_pos = 0-1;
	for(size_t c=0; c<src.length(); c++)
	{
		if( src[c] == '=' )
		{
			separator_pos = c;
			break;
		}
	}

	if(separator_pos == 0-1)
	{
		String temp;
		temp += "Разделитель не найден в строке: ";
		temp += src;
		throw Error( temp );
	}

	std::string strWord   = src.substr( 0, separator_pos );
	std::string strCount  = src.substr( separator_pos+1, src.length()-separator_pos-1 );
		
	ksstr::trim(strWord);
	ksstr::trim(strCount);

	word = strWord;
	if(sscanf(strCount.c_str(),"%u", &count) != 1)
	{
		String temp;
		temp = "Ошибка сканирования цифры из строки: ";
		temp += src;
		throw Error(temp);
	}



	return true;
}







//======================================================================
//					WordsWeight							
//======================================================================
 
WordsWeight::WordsWeight(const WCHAR* filepath) throw (Error)
{
	m_items = NULL;
	
	if( ksfilefunc::fileExistsW(filepath) )
	{
		m_fullPath = filepath;
	}
	else
	{
		String temp;
		temp = "Файл ";
		temp += ksstr::convertWstringToAstringWinapi(std::wstring(filepath));
		temp += " не найден !";

		throw Error(temp.c_str());
	}

	Load();
}

WordsWeight::~WordsWeight()
{
//	Save();

	delete m_items;
	m_items = NULL;
}

/*
bool WordsWeight::Search(const WordsWeightItem_s& a1, const WordsWeightItem_s& a2)
{
	//assert(false && "  нет кода  поиска ");
	if(a1.word == a2.word)
	{
		return true;
	}

	return false;
}
*/

UINT WordsWeight::GetWordWeightUint(const char* eng_word) const throw(Error)
{
	WordsWeightItem_s itm;

	itm.count = 0;
	itm.word = eng_word;

	/*
	if( std::find(m_items->begin(), m_items->end(), Search) != m_items->end() )
	{
		assert (false && "  found  ");

	}
	else
	{
		assert(  false && "  not found !!" );
	}
	*/

	for(size_t c=0; c<m_items->size(); c++)
	{
		if( m_items->at(c).word == itm.word )
		{
			return m_items->at(c).count;
		}
	}

	String temp;
	temp += "Слово ";
	temp += eng_word;
	temp += " не найдено в списке WordsWeight";
	throw Error( temp );

	return itm.count;
}

bool WordsWeight::DoSort(const WordsWeightItem_s& a1, const WordsWeightItem_s& a2)
{
	if(a1.count > a2.count)
	{
		return true;
	}

	return false;
}

void WordsWeight::Load() throw (Error)
{
	if(!m_items)
	{
		m_items = new std::vector<WordsWeightItem_s>();
	}

	m_items->clear();

	//assert(false && " проверить код загрузки ");

	std::vector<std::string>  text;
	{
		std::string temp;
	
		if(!ksstr::loadStrFromFileW( temp, m_fullPath.c_str() ) )
		{
			throw Error("Ошибка загрузки файла");
		}

		ksstr::splitLines(text, temp);
	}

	WordsWeightItem_s current;

	for(size_t c=0; c<text.size(); c++)
	{
		if( text.at(c).empty() )
		{
			continue;
		}

		if( !current.FromString(text.at(c)) )
		{
			throw Error("Ошибка чтения из строки");
		}
		
		m_items->push_back(current);

	}

	std::sort(m_items->begin(), m_items->end(), DoSort);
 

	int __end =0;
}

/*
void WordsWeight::Save() throw (Error)
{
	assert(false && " Вставить код сохранения ");
}
*/
